home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / tool / dprint / dp_data.c < prev    next >
Text File  |  1994-08-11  |  5KB  |  265 lines

  1. /*
  2.  
  3. 8086|Printman/POSTCARD データ処理メニュー
  4. Copyright (c) 1993,94 Delmonta
  5.  
  6. */
  7.  
  8. #include<stdlib.h>
  9. #include<farstr.h>
  10. #include"dprint.h"
  11.  
  12. /*---------------------------------------------------------------------------*/
  13.  
  14. static    void    dp_insert(void)
  15. {
  16.     unsigned    i;
  17.     int        ret[1];
  18.  
  19.     static    struct    SHEETDAT    sheet[1] = 
  20.     {    {SHEET_VALUE1,"枚数",1,DUMMY,NULL},    };
  21.  
  22.     if    (Cardnum==MAXCARD)
  23.     {
  24.         dp_errmes("カードはこれ以上増やせません.");
  25.         return;
  26.     }
  27.     else if    (Cardnum==0)
  28.         return;
  29.  
  30.     sheet[0].max = MAXCARD-Cardnum;
  31.     ret[0] = 1;
  32.  
  33.     if    (!dp_sheetselect(SYSLINE_START,sheet,1,ret))
  34.         return;
  35.  
  36.     for    (i=Cardnum-1 ; (signed int)i>=(signed int)Cardpos ; i--)
  37.     {
  38.         dp_errmes("");
  39.         Card[i+ret[0]] = Card[i];
  40.     }
  41.  
  42.     for    (i=0 ; i<ret[0] ; i++)
  43.     {
  44.         if    (!addcard(Cardpos+i))    /* 途中でメモリ不足になった場合 */
  45.         {
  46.             unsigned    j;
  47.  
  48.             printf("\033[17;1f%u blanks are allocated. \n",i);
  49.  
  50.             for    (j=0 ; j<Cardnum-Cardpos ; j--)
  51.                 Card[Cardpos+i+j] = Card[Cardpos+ret[0]+j];
  52.  
  53.             break;
  54.         }
  55.     }
  56.  
  57.     Cardnum += i;
  58.     Changedflag = TRUE;
  59.     card_reshow(63);
  60.     dp_putcardnum();
  61. }
  62.  
  63. /*---------------------------------------------------------------------------*/
  64.  
  65. static    void    dp_delete(void)
  66. {
  67.     int        s,e;
  68.     unsigned    i,n;
  69.  
  70.     if    (!input_st_ed("削除",&s,&e))
  71.         return;
  72.  
  73.     n = e - s + 1;
  74.  
  75.     for    ( i=s ; i<=e ; i++)
  76.     {
  77.         void    farfree(void far *);
  78.  
  79.         farfree(Card[i]);
  80.  
  81.         Card[i] = Card[i+n];
  82.     }
  83.     Cardnum -= n;
  84.     if    (Cardpos > Cardnum)
  85.         Cardpos = Cardnum;
  86.  
  87.     Changedflag = TRUE;
  88.     card_reshow(63);
  89.     dp_putcardnum();
  90. }
  91.  
  92. /*---------------------------------------------------------------------------*/
  93.  
  94. static    enum SORTTYPE    {SORT_UP=0,SORT_DOWN}    Sort_type;
  95.  
  96. static    int    dpsort_sub(p,q)
  97. struct POSTCARD    far **p,far **q;
  98. {
  99.     int    a = (*p)->zipcode[0] - (*q)->zipcode[0];
  100.  
  101.     if    (a==0)
  102.         a = (*p)->zipcode[1] - (*q)->zipcode[1];
  103.  
  104.     if    (Sort_type==SORT_DOWN)
  105.         a = -a;
  106.  
  107.     return a;
  108. }
  109.  
  110. static    void    dp_sort(void)
  111. {
  112.     static    struct    SHEETSEL select[2] = 
  113.     {
  114.         {19,"昇順"},
  115.         {25,"降順"},
  116.     };
  117.  
  118.     static    struct    SHEETDAT sheet[3] = 
  119.     {
  120.         {SHEET_VALUE1,"開始位置",1,DUMMY,NULL},
  121.         {SHEET_VALUE1,"終了位置",SHEET_CREF(0),DUMMY,NULL},
  122.         {SHEET_SELECT,"順序",0,2,select},
  123.     };
  124.  
  125.     int    ret[3];
  126.  
  127.     sheet[0].max = sheet[1].max = Cardnum;
  128.  
  129.     ret[0] = 1;
  130.     ret[1] = Cardnum;
  131.     ret[2] = 0;
  132.  
  133.     if    (!iscardexist() || !dp_sheetselect(SYSLINE_START,sheet,3,ret))
  134.         return;
  135.  
  136.     Sort_type = (enum SORTTYPE)ret[2];
  137.  
  138.     qsort(Card+ret[0]-1,ret[1]-ret[0]+1,sizeof(Card[0]),
  139.                     (int (*)(void *,void *))dpsort_sub);
  140.  
  141.     card_reshow(63);
  142.     Changedflag = TRUE;
  143. }
  144.  
  145. /*---------------------------------------------------------------------------*/
  146.  
  147. static    int    Find_zip[2];
  148. static    char far *Find_str;
  149.  
  150. static    bool    dpfind_sub(unsigned pos)
  151. {
  152.     int    i;
  153.  
  154.     for    (i=0 ; i<5 ; i++)
  155.     {
  156.         if    (far_strstr(Card[pos]->data[i],Find_str)==NULL)
  157.             break;
  158.     }
  159.  
  160.     if    (i==5)        /* 文字列が見つからなかった場合 */
  161.         return FALSE;
  162.  
  163.     if    (Find_zip[0]!=-1)
  164.     {
  165.         if    (Card[pos]->zipcode[0]!=Find_zip[0])
  166.             return FALSE;
  167.                     /* ↑↓郵便番号が不一致のとき */
  168.         if    (Find_zip[1]!=-1 && Card[pos]->zipcode[1]!=Find_zip[1])
  169.             return FALSE;
  170.     }
  171.  
  172.     Cardpos = pos;
  173.     card_reshow(63);
  174.     dp_putcardnum();
  175.  
  176.     if    (dp_errmes("データ発見    [ESC]中止   [それ以外]次へ")=='\033')
  177.         return TRUE;
  178.     else
  179.         return FALSE;
  180. }
  181.  
  182. static    void    dp_find(void)
  183. {
  184. static    struct    SHEETSEL    sel[2] = 
  185.     {
  186.         {19,"前から後ろへ"},
  187.         {33,"後ろから前へ"},
  188.     };
  189.  
  190. static    struct    SHEETDAT    sheet[5] = 
  191.     {
  192.         {SHEET_VALUE1,"検索開始位置",            1,DUMMY,NULL },
  193.         {SHEET_VALUE1,"検索終了位置",SHEET_CREF(0),DUMMY,NULL },
  194.         {SHEET_STRING,"郵便番号"    ,            0,    6,DUMMY},
  195.         {SHEET_STRING,"文字列"      ,            0,   62,DUMMY},
  196.         {SHEET_SELECT,"順序"        ,            0,    2,sel  },
  197.     };
  198.  
  199.     int        ret[5];
  200.     char        zipbuf[7];
  201.     char        strbuf[63];
  202.     unsigned    i;
  203.  
  204.     zipbuf[0] = strbuf[0] = '\0';
  205.  
  206.     sheet[0].max = sheet[1].max = Cardnum;
  207.     sheet[2].pos = zipbuf;
  208.     sheet[3].pos = strbuf;
  209.  
  210.     ret[0] = 1;
  211.     ret[1] = Cardnum;
  212.     ret[4] = 0;
  213.  
  214.     if    (!iscardexist() || !dp_sheetselect(SYSLINE_START,sheet,5,ret))
  215.         return;
  216.  
  217.     Find_str = (char far *)strbuf;
  218.  
  219.     switch    (sscanf(zipbuf,"%u-%u",&Find_zip[0],&Find_zip[1]))
  220.     {
  221.     case -1:
  222.     case 0:    Find_zip[0] = -1;    break;
  223.     case 1: Find_zip[1] = -1;    break;
  224.     }
  225.  
  226.     if    (ret[4]==0)            /* 前から後ろへ(後方検索) */
  227.         for    (i=ret[0]-1 ; i<ret[1] ; i++)
  228.         {
  229.             if    (dpfind_sub(i))
  230.                 return;
  231.         }
  232.     else                    /* 後ろから前へ(前方検索) */
  233.         for    (i=ret[1]-1 ; i>ret[0] ; i--)
  234.         {
  235.             if    (dpfind_sub(i))
  236.                 return;
  237.         }
  238.  
  239.     dp_errmes("データが見つかりません.");
  240. }
  241.  
  242. /*---------------------------------------------------------------------------*/
  243.  
  244. void    dp_datamenu(void)
  245. {
  246. static    struct    MENUDAT    menu[] =
  247.     {
  248.         {'I',"挿入","現在のカード位置に空のカードを挿入します"},
  249.         {'D',"削除","カードを削除します"},
  250.         {'S',"ソート","カードを郵便番号でソートします"},
  251.         {'F',"検索","特定のデータを含むカードを検索します"},
  252.     };
  253.  
  254.     int    a = dp_menuselect("F5:データメニュー",4,menu);
  255.  
  256.     switch    (a)
  257.     {
  258.     case -1:            break;
  259.     case  0:    dp_insert();    break;
  260.     case  1:    dp_delete();    break;
  261.     case  2:    dp_sort();    break;
  262.     case  3:    dp_find();    break;
  263.     }
  264. }
  265.